package com.ExcelServer.listen;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/***
 * 名称：无模型数据监听器。 使用范文模板数据进行监听读取
 * 描述：这是用来创建以及记录excel转化mysql的table的监听器，表 excel_create_info 是记录创建表信息的表。
 * 表的创建，表的表名是excel_create_info 的 "template+id/excel+id"。
 * 在属性一致的情况下，表不会新建，而是会直接插入数据，插入的列名的key值即为表的表头属性。
 * ***/

@Slf4j
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {
    /**
     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    private List<Map<Integer, String>> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    private List<Map<String, String>> excelData=new ArrayList<>();


    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {

        String s = JSON.toJSONString(headMap);
        System.out.println(s);
        changekey(headMap);


        super.invokeHeadMap(headMap, context);
    }

    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        cachedDataList.add(data);
//        excelData.add(data);
        changekey(data);
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    private void changekey(Map<Integer, String> data) {
        Map<String,String> map = new HashMap<>();
        for (Map.Entry<Integer, String> entry : data.entrySet()) {
            Integer key = entry.getKey();

            String value = entry.getValue();
            String _key = "_"+key;

            map.put(_key,value);

            System.out.println(key+":"+value);
        }
        excelData.add(map);
    }


    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData();
        log.info("所有数据解析完成！");
    }

    /**
     * 加上存储数据库，此处不做存储。对内存压力较大。
     */
    private void saveData() {

        log.info("{}条数据，开始存储数据库！", cachedDataList.size());
        log.info("存储数据库成功！");
    }


    public List getDateList(){
        return this.excelData;
    }

}
